// 题目描述：
// 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。

// 请注意 ，必须在不复制数组的情况下原地对数组进行操作。



// 示例 1:

// 输入: nums = [0,1,0,3,12]
// 输出: [1,3,12,0,0]
// 示例 2:

// 输入: nums = [0]
// 输出: [0]

// 自己的答案：
let nums = [1, 3, 12, 0, 0]
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
    let n = 0
    // for (let i = 0; i < nums.length - n; i++) {
    //     if(nums[i] === 0) {
    //         nums.splice(i, 1)
    //         nums.push(0)
    //         n++
    //     }
    // }
    let i = nums.length
    while (i--) {
        if (nums[i] === 0) {
            nums.splice(i, 1);
            ++n
        }
    }
    nums.push(...Array(n).fill(0))
};

// Gpt答案：
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
    let slow = 0
    for (let fast = 0; fast < nums.length; fast++) {
        if (nums[fast] !== 0) {
            nums[slow] = nums[fast] // 匹配到 0 后跳过，非零的索引 + 1，等再匹配到非 0 的数字后把该数组赋值给非零的索引，得到无 0 的数组
            slow++
        }
    }
    nums.fill(0, slow)
};

// 官方答案：
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
    let i0 = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== 0) {
            [nums[i], nums[i0]] = [nums[i0], nums[i]]; // 匹配到 0 后跳过，非零的索引 + 1，交换数字，等再匹配到非 0 的数字后把该数组赋值给非零的索引，这样所有为 0 的数字都会像冒泡排序一样被往后排
            i0++;
        }
    }
};